package com.example.entity;

/**
 * Cloneable 是一个没有方法的标记接口，JVM 通过反射或 instanceof 来检测你是否实现它，从而决定是否允许 clone()；这种机制和注解虽然都是“标记”，但注解更灵活，使用范围也更广。
 * 典型的**标记接口（Marker Interface）**设计：
 * 特点	                            说明
 * 没有任何方法	                    只是一种“身份标志”
 * 接口名字代表某种能力	                比如 Cloneable → 能被克隆；Serializable → 可序列化
 * JVM 或 Java 标准库会做出特殊处理	    根据你是否实现该接口决定是否允许某些操作
 * 🔸 就像交通灯没有“功能”，但你看到红灯就知道要停，Java 看到类实现了 Cloneable，就知道它“允许克隆”。
 * 通过反射中的 isAssignableFrom() 或 instanceof，你可以动态判断一个类是否实现了 Cloneable 接口，JVM 也是用这种机制来决定是否允许对象执行 clone() 操作。
 */

/**
 * Cloneable 是如何作为“标志”被识别的？
 * ✔️ 回答：是的，JVM 是通过反射机制识别的！
 * 当你调用 Object.clone() 方法时，JVM 会做这样的检查（逻辑层面）：
 * if (!(object instanceof Cloneable)) {
 * throw new CloneNotSupportedException();
 * }
 * 也就是说：
 * Java 虚拟机会判断：这个对象是否是 Cloneable 的实例
 * 判断方式：通过 instanceof 运算符 或 反射机制中的 Class.isAssignableFrom() 等方法
 */
public class BigAnimal implements Cloneable {

    // 不可变对象
    public String name;
    // 基本类型
    public int age;
    // 可变引用对象
    public Master master;

    public BigAnimal(String name, int age, Master master) {
        this.name = name;
        this.age = age;
        this.master = master;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}
/**
 * 比较维度	        Cloneable（标记接口）	        注解（如 @Override, @Deprecated）
 * 类型	            接口（interface）	        注解（Annotation）
 * 是否有方法	        ❌ 无任何方法	                ✅ 可有属性（如：@MyAnno(name="A")）
 * 检测方式	        运行时 instanceof 或反射	    依赖编译器处理 或反射（取决于保留策略）
 * 生效时机	        编译期 + 运行期都可	        通常在编译期，也可以保留到运行期（取决于策略）
 * 使用方式	        implements Cloneable	    @SomeAnnotation
 * 是否支持多继承	    ✅（接口可多继承）	            ❌（注解不能继承）
 * 典型用途	        控制权限、允许某种功能	        标记方法/类，用于工具分析、反射配置等
 */
